home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
telecomm
/
sticpsrc.lzh
/
SOURCE.ARC
/
FTP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1990-03-03
|
4KB
|
177 lines
/* Stuff common to both the FTP server and client */
#include <stdio.h>
#include "global.h"
#include "mbuf.h"
#include "netuser.h"
#include "timer.h"
#include "tcp.h"
#include "ftp.h"
#include "session.h"
/* FTP Data channel Receive upcall handler */
void
ftpdr(tcb,cnt)
struct tcb *tcb;
int16 cnt;
{
register struct ftp *ftp;
struct mbuf *bp;
char c;
ftp = (struct ftp *)tcb->user;
if(ftp->state != RECEIVING_STATE){
close_tcp(tcb);
return;
}
/* This will likely also generate an ACK with window rotation */
recv_tcp(tcb,&bp,cnt);
#if (defined(UNIX) || defined(MAC) || defined(AMIGA) || defined(ATARI_ST) || defined(MSC))
if(ftp->type == ASCII_TYPE){
while(pullup(&bp,&c,1) == 1){
if(c != '\r')
putc(c,ftp->fp);
}
} else /* watch out! */
#endif
while(bp != NULLBUF){
if(bp->cnt != 0)
fwrite(bp->data,1,(unsigned)bp->cnt,ftp->fp);
bp = free_mbuf(bp);
}
if(ftp->fp != stdout && ferror(ftp->fp)){ /* write error in file (disk full?) */
fclose(ftp->fp);
ftp->fp = NULLFILE;
close_self(tcb,RESET);
if (ftp->username != NULLCHAR) /* is this a server? */
tprintf(ftp->control,"452 Disk full or write error\r\n");
}
}
/* FTP Data channel Transmit upcall handler */
void
ftpdt(tcb,cnt)
struct tcb *tcb;
int16 cnt;
{
struct ftp *ftp;
struct mbuf *bp;
register char *cp;
register int c;
int eof_flag;
ftp = (struct ftp *)tcb->user;
if(ftp->state != SENDING_STATE){
close_tcp(tcb);
return;
}
if(ftp->type == ASCII_TYPE)
cnt++;
while((bp = alloc_mbuf(cnt)) == NULLBUF){
if ((cnt /= 2) == 0)
/* Hard to know what to do here */
return;
}
eof_flag = 0;
if(ftp->type == IMAGE_TYPE){
bp->cnt = fread(bp->data,1,cnt,ftp->fp);
if(bp->cnt != cnt)
eof_flag = 1;
} else {
cp = bp->data;
while(cnt > 1){
if((c = getc(ftp->fp)) == EOF){
eof_flag=1;
break;
}
#if (defined(CPM) || defined(MSDOS))
/* ^Z is CP/M's text EOF marker, and it is sometimes used
* by MS-DOS editors too
*/
if(c == CTLZ){
eof_flag = 1;
break;
}
#endif
#if (defined(UNIX) || defined(MAC) || defined(AMIGA) || defined(ATARI_ST) || defined(MSC))
if(c == '\n'){
*cp++ = '\r';
bp->cnt++;
cnt--;
}
#endif
*cp++ = c;
bp->cnt++;
cnt--;
}
}
if(bp->cnt != 0)
send_tcp(tcb,bp);
else
free_p(bp);
if(eof_flag){ /* EOF seen */
fclose(ftp->fp);
ftp->fp = NULLFILE;
close_tcp(tcb);
}
}
/* Allocate an FTP control block */
struct ftp *
ftp_create(bufsize)
unsigned bufsize;
{
void ftp_delete();
register struct ftp *ftp;
if((ftp = (struct ftp *)calloc(1,sizeof (struct ftp))) == NULLFTP)
return NULLFTP;
if(bufsize != 0 && (ftp->buf = malloc(bufsize)) == NULLCHAR){
ftp_delete(ftp);
return NULLFTP;
}
ftp->state = COMMAND_STATE;
ftp->type = ASCII_TYPE; /* Default transfer type */
return ftp;
}
/* Free resources, delete control block */
void
ftp_delete(ftp)
register struct ftp *ftp;
{
int i;
void ftp_dellist();
if(ftp->fp != NULLFILE && ftp->fp != stdout)
fclose(ftp->fp);
if(ftp->data != NULLTCB)
del_tcp(ftp->data);
if(ftp->username != NULLCHAR)
free(ftp->username);
for(i = 0; i < MAXPATH; i++)
if(ftp->path[i] != NULLCHAR)
free(ftp->path[i]);
if(ftp->buf != NULLCHAR)
free(ftp->buf);
if(ftp->cd != NULLCHAR)
free(ftp->cd);
if(ftp->filename != NULLCHAR)
free(ftp->filename);
if(ftp->session != NULLSESSION)
freesession(ftp->session);
ftp_dellist(ftp);
stop_timer(&ftp->xfertime);
free((char *)ftp);
}
/* Delete the list of files */
void
ftp_dellist(ftp)
register struct ftp *ftp;
{
register struct ftp_list *ftp_list;
while ((ftp_list = ftp->ftp_list) != NULLFTPLIST) {
ftp->ftp_list = ftp_list->next;
free(ftp_list);
}
}